/*******************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.        */
/*                                                                 */
/*  NAME      = frcomm.c                                           */
/*  NOTE      =                                                    */
/*  DATE      = 2015/01/08                                         */
/*******************************************************************/
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <limits.h>
#include <stdarg.h>

#include "frcomm.h"

/*******************************************************************************
*  FUNC     :  将struct timeval的时间转换为本地时间
*
*  ARGS     :  p_tv             （struct timeval结构体指针）
*           ：  p_time             将struct timeval的时间
*                                转换年/月/日  时:分:秒.微秒格式输出
*           :  ui_time_size      p_time的空间大小
*  RTN      :  FR_SUCC           (normal)
*              FR_FAIL           (error)
*  NOTE     :
*******************************************************************************/
FR_STATIC int __frtime2str(struct timeval *p_tv , char *p_time, unsigned int ui_time_size)
{
    struct tm *p_tm = NULL;

    if(p_tv == NULL || p_time == NULL || ui_time_size <= 1)
        return FR_FAIL;

    p_tm = localtime(&(p_tv->tv_sec));

    snprintf(p_time,ui_time_size,"%04d/%02d/%02d  %02d:%02d:%02d.%06d",
            p_tm->tm_year + 1900,p_tm->tm_mon + 1,p_tm->tm_mday,
            p_tm->tm_hour,p_tm->tm_min,p_tm->tm_sec,(int)p_tv->tv_usec);

    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  带有文件名,行数，函数, 时间的debug出力
*  ARGS     :  p_file(文件名)
*           :  i_line(行数)
*           :  p_fun(函数)
*           :  p_fmt(出力format)
*  RTN      :  void
*  NOTE     :
*******************************************************************************/
void frdbg_print(const char *p_file, int i_line
               , const char *p_fun, const char *p_fmt , ...)
{
	va_list st_ap;
    struct timeval time;
    char arr_time[128];
    char arr_out1[128];
    char arr_out2[512];

    gettimeofday( &time, NULL );
    __frtime2str(&time,arr_time,sizeof(arr_time));

    snprintf(arr_out1, sizeof(arr_out1), "[%s:%u(%s) %s]", p_file, i_line, p_fun, arr_time);
    va_start(st_ap , p_fmt);
    vsnprintf(arr_out2, sizeof(arr_out2), p_fmt, st_ap);
    va_end(st_ap);
    printf("%s %s\n",arr_out1,arr_out2);
	return;
}
